package com.cust.yx.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.cust.yx.client.ActivityFeignClient;
import com.cust.yx.client.ProductFeignClient;
import com.cust.yx.common.auth.AuthContextHolder;
import com.cust.yx.enums.SkuType;
import com.cust.yx.model.product.Category;
import com.cust.yx.model.product.SkuInfo;
import com.cust.yx.model.search.SkuEs;
import com.cust.yx.repository.SkuRepository;
import com.cust.yx.service.SkuService;
import com.cust.yx.vo.search.SkuEsQueryVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;

import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

@Service
public class SkuServiceImpl implements SkuService {

    @Autowired
    private ProductFeignClient productFeignClient;

    @Autowired
    private ActivityFeignClient activityFeignClient;

    @Autowired
    private SkuRepository skuRepository;

    /**
     * 上架商品
     *
     * @param skuId 商品SKU的ID
     */
    @Override
    public void upperSku(Long skuId) {
        // 通过远程调用，根据skuId获取商品相关信息
        SkuInfo skuInfo = productFeignClient.getSkuInfo(skuId);
        if (skuInfo == null) {
            return;
        }
        // 获取商品所属分类信息
        Category category = productFeignClient.getCategory(skuInfo.getCategoryId());

        // 封装商品信息为SkuEs对象，用于存储在ES中
        SkuEs skuEs = new SkuEs();
        // 封装商品分类的ID和名称
        if (category != null) {
            skuEs.setCategoryId(category.getId());
            skuEs.setCategoryName(category.getName());
        }
        // 封装SKU基本信息
        skuEs.setId(skuInfo.getId());
        skuEs.setKeyword(skuInfo.getSkuName() + "," + skuEs.getCategoryName());
        skuEs.setWareId(skuInfo.getWareId());
        skuEs.setIsNewPerson(skuInfo.getIsNewPerson());
        skuEs.setImgUrl(skuInfo.getImgUrl());
        skuEs.setTitle(skuInfo.getSkuName());

        // 根据SKU类型，封装价格、库存等信息
        if (skuInfo.getSkuType().equals(SkuType.COMMON.getCode())) {
            // 普通商品的处理
            skuEs.setSkuType(0);
            skuEs.setPrice(skuInfo.getPrice().doubleValue());
            skuEs.setStock(skuInfo.getStock());
            skuEs.setSale(skuInfo.getSale());
            skuEs.setPerLimit(skuInfo.getPerLimit());
        }
        // 将封装好的商品信息保存到ES中
        skuRepository.save(skuEs);
    }

    //下架
    @Override
    public void lowerSku(Long skuId) {
        skuRepository.deleteById(skuId);
    }

    /**
     * 获取爆款商品列表。
     */
    @Override
    public List<SkuEs> findHotSkuList() {
        // 分页请求，获取第1页10条记录
        Pageable pageable = PageRequest.of(0, 10);
        // 根据热门分数降序查找商品
        Page<SkuEs> pageModel = skuRepository.findByOrderByHotScoreDesc(pageable);
        // 获取查询结果的内容列表
        List<SkuEs> skuEsList = pageModel.getContent();
        return skuEsList;
    }

    /**
     * 查询分类商品
     *
     * @param pageable
     * @param skuEsQueryVo
     * @return
     */
    @Override
    public Page<SkuEs> search(Pageable pageable, SkuEsQueryVo skuEsQueryVo) {
        //向SkuEsQueryVo设置wareId，当前登录用户的仓库id
        skuEsQueryVo.setWareId(AuthContextHolder.getWareId());

        Page<SkuEs> pageModel = null;
        //调用SkuRepository方法，根据springData命名规则定义方法，进行条件查询
        // 判断keyword是否为空，如果为空 ，根据仓库id + 分类id查询
        String keyword = skuEsQueryVo.getKeyword();
        if (StringUtils.isEmpty(keyword)) {
            pageModel = skuRepository.findByCategoryIdAndWareId(
                    skuEsQueryVo.getCategoryId(),
                    skuEsQueryVo.getWareId(),
                    pageable);
        } else {
            ///如果keyword不为空根据仓库id + keyword进行查询
            pageModel = skuRepository.findByKeywordAndWareId(
                    skuEsQueryVo.getKeyword(),
                    skuEsQueryVo.getWareId(),
                    pageable);
        }

        // 查询商品参加优惠活动
        List<SkuEs> skuEsList = pageModel.getContent();

        if (!CollectionUtils.isEmpty(skuEsList)) {
            //遍历skuEsList，得到所有skuId
            List<Long> skuIdList = skuEsList.stream()
                    .map(item -> item.getId())
                    .collect(Collectors.toList());
            // map集合key是skuId值，value是List集合，sku参与活动里面多个规则名称列表
            //一个商品只能参加一个活动，一个活动里面可以有多个规则
            //比如满减活动有两个规则：满20元减1元，满58元减5元
            Map<Long, List<String>> skuIdToRuleListMap =
                    activityFeignClient.findActivity(skuIdList);
            //封装获取数据到skuEs里面 ruleList属性里面
            if (skuIdToRuleListMap != null) {
                skuEsList.forEach(skuEs -> {
                    skuEs.setRuleList(skuIdToRuleListMap.get(skuEs.getId()));
                });
            }
        }
        return pageModel;
    }
}
